package linkedlist;

/**
 * 循环链表
 */
public class DoubleHeroNodeLinkedList {

    //头节点
    private DoubleHeroNode head=new DoubleHeroNode(1,"","");

    /**
     * 添加
     */
    public void add(DoubleHeroNode doubleHeroNode){
        //头节点不能动，我们需要一个辅助便利temp
        DoubleHeroNode temp = head;
        //遍历链表，找到最后
        while (true) {
            if (temp.next==null){
                break;
            }
            //如果没有找到就后移
            temp=temp.next;
        }
        //将最后一个节点的next指向新的节点
        temp.next = doubleHeroNode;
        doubleHeroNode.pre=temp;
    }

    /**
     * 删除
     */
    public void delete(int no) {

        // 判断当前链表是否为空
        if (head.next == null) {// 空链表
            System.out.println("链表为空，无法删除");
            return;
        }

        DoubleHeroNode temp = head.next; // 辅助变量(指针)
        boolean flag = false; // 标志是否找到待删除节点的
        while (true) {
            if (temp == null) { // 已经到链表的最后
                break;
            }
            if (temp.no == no) {
                // 找到的待删除节点的前一个节点temp
                flag = true;
                break;
            }
            temp = temp.next; // temp后移，遍历
        }
        // 判断flag
        if (flag) { // 找到
            // 可以删除
            // temp.next = temp.next.next;[单向链表]
            temp.pre.next = temp.next;
            // 这里我们的代码有问题?
            // 如果是最后一个节点，就不需要执行下面这句话，否则出现空指针
            if (temp.next != null) {
                temp.next.pre = temp.pre;
            }
        } else {
            System.out.printf("要删除的 %d 节点不存在\n", no);
        }
    }
    /**
     * 修改
     */
    public void  update(DoubleHeroNode newHeroNode){
        if (head.next==null){
            System.out.println("链表为空");
            return;
        }

        //根据no找到需要修改的节点
        DoubleHeroNode temp=head.next;
        boolean flag=false;
        while (true){
            if (temp==null){
                break;
            }
            if (temp.no==newHeroNode.no){
                flag=true;
                break;
            }
            temp=temp.next;
        }
        if (flag){
            temp.name= newHeroNode.name;
            temp.nickname= newHeroNode.nickname;
        }else {
            System.out.println("没有找到编号为："+ newHeroNode.no+"的节点，不能修改");
        }
    }
    /**
     * 显示
     */
    public void list(){
        if (head.next==null){
            System.out.println("链表为空");
            return;
        }
        //头节点不能动，需要一个辅助变量来遍历
        DoubleHeroNode temp = head.next;
        while (true) {

            if (temp==null){
                break;
            }
            //输出节点的信息
            System.out.println(temp);
            //将temp后移
            temp=temp.next;
        }
    }
}
